let obj = {
  a: 1, b: 2
};

/**
 * 1. target : 目标对象
 * 2. handler: 具体的操作
 *
 * Reflect :反射 : 作用 每个方法都和 Proxy一一对应
 */
let newTarget = new Proxy(obj, {
  // 1. target : 原对象
  // 2. p : key
  // 3. value: 新的值
  // 4. receiver : 原对象的proxy格式
  // set(target, p, value, receiver) {
  //   console.log('set', target, p, value, receiver);
  // },
  get(target, p, receiver) {
    // console.log('get', target, p, receiver)
    return Reflect.get(target, p);
  },
  has(target, p) {
    console.log('has', target, p);
  },
  ownKeys(target) {
    // 拦截的逻辑
    // :key : 数字  字符串
    return Reflect.ownKeys(target);
  },
  deleteProperty(target, p) {
    console.log('deleteProperty', target, p);
    if (p === 'a') {
      return false;
    }
    delete target[p];
    return target;
  },
  // ownKeys(target) {
  //   console.log('ownKeys', target);
  // }
});

newTarget.a = 10;
// newTarget.a;

// 某一个属性是否属于这个对象 in
if ('a' in newTarget) {

}

// 和Proxy里面的方法一一对应
// Reflect.deleteProperty(newTarget, 'b');
Reflect.get(newTarget, 'a');

//
// delete newTarget['a'];
// delete newTarget['b'];
Reflect.ownKeys(newTarget);

// 获取目标对象的属性描述器
Reflect.getOwnPropertyDescriptor(newTarget, 'a');
//{value: 1, // 值
// writable: true, 是否可写
// enumerable: true,  是否可枚举 遍历 forin
// configurable: true} 是否可改写


// 关于操作原型  getPrototypeOf setPrototypeOf
// __proto__ : 隐式原型

Reflect.setPrototypeOf(newTarget, []);

// newTarget.push('1');
Reflect.getPrototypeOf(newTarget);

